package sv.com.renacempleo.web.controller.red;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletResponse;

import net.sf.json.JSONArray;

import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.tuckey.web.filters.urlrewrite.utils.StringUtils;

import sv.com.renacempleo.dto.red.RedEmpresaSucursales;
import sv.com.renacempleo.dto.red.RedEmpresas;
import sv.com.renacempleo.dto.red.RedEmpresasContactos;
import sv.com.renacempleo.exception.WebException;
import sv.com.renacempleo.web.controller.BaseController;
import sv.com.renacempleo.web.security.CustomUser;
import sv.com.renacempleo.web.util.DBContext;
import sv.com.renacempleo.web.util.WebUtilidades;

@SuppressWarnings("serial")
@Controller
@RequestMapping("/red/empresas")
public class RedEmpresasController extends BaseController{

	@RequestMapping(value = "/view", method = {RequestMethod.GET, RequestMethod.POST})
	public String view(ModelMap model, 
			@RequestParam (required = false) String header) {
		model.addAttribute(WebUtilidades.HEADER_TITLE, StringUtils.isBlank(header) ? "EMPRESAS" : header);
		try {
			model.put("ctgMediosBusqueda", JSONArray.fromObject(DBContext.getCtgCatalogoDao().findAllByCodigoAsArray(WebUtilidades.CTG_MEDIOS_BQD_EMPLEO_PADRE)));
			model.put("ctgOficinas", JSONArray.fromObject(DBContext.getCtgOficinasDao().findAllActivesAsArray()));
			model.put("sgdUsuario", JSONArray.fromObject(DBContext.getSgdUsuarioDao().findAllActivesAsArray()));
			model.put("data", JSONArray.fromObject(DBContext.getRedEmpresasDao().findAllInactivesAsArray()));
		} catch (WebException e) {
			logger.error("Exception:", e);
		}
		return "red/empresas/redEmpresas";
	}
	
	@RequestMapping(value = "/findById", method = {RequestMethod.GET, RequestMethod.POST})
	public void findById(@RequestParam(required = false) Long redEmpresaFolio, HttpServletResponse response) {
		Map<String, Object> result = new HashMap<String, Object>();
		Map<String, Object> catalogos = new HashMap<String, Object>();
		try{
			catalogos.put("ctgMediosBusqueda", DBContext.getCtgCatalogoDao().findAllByCodigoAsArray(WebUtilidades.CTG_MEDIOS_BQD_EMPLEO_PADRE));
			catalogos.put("ctgOficinas", DBContext.getCtgOficinasDao().findAllActivesAsArray());
			catalogos.put("sgdUsuario", DBContext.getSgdUsuarioDao().findAllActivesAsArray());
			catalogos.put("ctgDepartamentos", DBContext.getCtgDepartamentoDao().findAllActivesAsArray());
			catalogos.put("ctgMunicipios", DBContext.getCtgMunicipioDao().findAllActivesAsArray());
			
			//Agregar catalogos de actividad economica
			catalogos.put("ctgActividadEconomica", DBContext.getCiiu_04Dao().findAllAsArray());
			
			result.put("redEmpresaMedioBusqueda", createCheckboxGroup(DBContext.getRedEmpresasDao().findRedMediosBusquedaByRedEmpresaFolio(redEmpresaFolio), "redEmpresaMedioBusqueda"));
			result.put("catalogos", catalogos);
			if(redEmpresaFolio != null && redEmpresaFolio > 0){
				result.put("redEmpresa", DBContext.getRedEmpresasDao().findByIdAsMap(redEmpresaFolio));
				result.put("redEmpresaSucursalesList", DBContext.getRedEmpresasDao().findRedEmpresaSucursalByRedEmpresaFolio(redEmpresaFolio));
				result.put("redEmpresaContactosList", DBContext.getRedEmpresasDao().findRedEmpresaContactoByRedEmpresaFolio(redEmpresaFolio));
			}
			result.put(SUCCESS, true);
		}catch(WebException e){
			logger.error(e, e);
			result.put(MESSAGE, e.getMessage());
			result.put(FAILURE, true);
		}catch(Exception e){
			logger.error(e, e);
			result.put(MESSAGE, "Problemas a tratar de cargar la informaci\u00F3n");
			result.put(FAILURE, true);
		}
		serializeObject(result, response);
	}
	
	@RequestMapping(value = "/validarEmpresa", method = {RequestMethod.POST})
	public void validarEmpresa(HttpServletResponse response,
			@RequestParam String redEmpresaNit,
			@RequestParam String redEmpresaRegistro){
		Map<String, Object> result = new HashMap<String, Object>();
		try {
			List<Object[]> list = DBContext.getRedEmpresasDao().findEmpresaByNit(redEmpresaNit);
			if(list.size()>0)
				result.put("validate", true);
			else
				result.put("validate", false);
				
			result.put(SUCCESS, true);
			result.put(MESSAGE, "Datos Actualizados");
		} catch (WebException e) {
			logger.error("Exception:", e);
			result.put(FAILURE, true);
			result.put(MESSAGE, e.getExceptionMessage());
		}catch(Exception e){
			logger.error("Exception:", e);
			result.put(FAILURE, true);
			result.put(MESSAGE, DEFAULT_ERROR_MESSAGE);
		}
		serializeObject(result, response);
	}
	
	@RequestMapping(value = "/buscarEmpresas", method = {RequestMethod.GET, RequestMethod.POST})
	public void buscarEmpresas(HttpServletResponse response,
			@RequestParam(required = false) int opcion, 
			@RequestParam(required = false) String estado,
			@RequestParam(required = false) String nombreComercial
			){
		Map<String, Object> result = new HashMap<String, Object>();
		try {
			CustomUser cu = WebUtilidades.getCustomUserFromAcegi();;
			result.put("empresas", JSONArray.fromObject(
					DBContext.getRedEmpresasDao().findEmpresaByCriterios(opcion, estado, nombreComercial,cu,new Long(0))));
		}catch (Exception e) {
			logger.error(e);
		}
		serializeObject(result, response);
	}
	
	@RequestMapping(value = "/buscarActivacionEmpresa", method = {RequestMethod.POST})
	public void buscarActivacionEmpresa(HttpServletResponse response,
			@RequestParam Long redEmpresaFolio){
		Map<String, Object> result = new HashMap<String, Object>();
		try {
			result.put("ctgMotivoBaja", JSONArray.fromObject(DBContext.getCtgCatalogoDao().findAllByCodigoAsArray(WebUtilidades.CTG_MOTIVOS_DE_BAJA_PADRE)));
			result.put("activacion", DBContext.getRedEmpresasDao().findByIdAsMap(redEmpresaFolio));
			result.put(SUCCESS, true);
		}catch (WebException e) {
			logger.error(e);
			result.put(MESSAGE, WebUtilidades.getExceptionMessage(e));
			result.put(FAILURE, true);
		}catch (Exception e) {
			logger.error(e);
			e.printStackTrace();
			result.put(MESSAGE, "Procesamiento Incorrecto");
			result.put(FAILURE, true);
		}
		result.put(MESSAGE, result.get(MESSAGE));
		serializeObject(result, response);
	}
	
	@RequestMapping(value = "/activarEmpresa", method = {RequestMethod.POST})
	public void activarEmpresa(HttpServletResponse response,
			@RequestParam Long redEmpresaFolio,
			@RequestParam String redEmpresaEstado,
			@RequestParam (required = false) Long ctgMotivoBaja){
		Map<String, Object> result = new HashMap<String, Object>();
		try{
			DBContext.getRedEmpresasService().activarRedEmpresa(redEmpresaFolio, redEmpresaEstado, ctgMotivoBaja);
			result.put("activacion", DBContext.getRedEmpresasDao().findByIdAsMap(redEmpresaFolio));
			result.put(MESSAGE, "Datos Actualizados");
			result.put(SUCCESS, true);
		}catch(WebException e){
			logger.error(e, e);
			result.put(MESSAGE, e.getMessage());
			result.put(FAILURE, true);
		}catch(Exception e){
			logger.error(e, e);
			result.put(MESSAGE, "Problemas a tratar de cargar la informaci\u00F3n");
			result.put(FAILURE, true);
		}
		serializeObject(result, response);
	}
	
	
	@RequestMapping(value = "/guardarEmpresa", method = {RequestMethod.GET, RequestMethod.POST})
	public void guardarEmpresa(@ModelAttribute RedEmpresas redEmpresas, HttpServletResponse response){
		Map<String, Object> result = new HashMap<String, Object>();
		try{
			DBContext.getRedEmpresasService().guardarEmpresa(redEmpresas);
			result.put("redEmpresaFolio", redEmpresas.getRedEmpresaFolio());
			result.put("redEmpresaFechaRegistro", redEmpresas.getRedEmpresaFechaRegistro());
			result.put(MESSAGE, "Datos Actualizados");
			result.put(SUCCESS, true);
		}catch(WebException e){
			logger.error(e, e);
			result.put(MESSAGE, e.getMessage());
			result.put(FAILURE, true);
		}catch(Exception e){
			logger.error(e, e);
			result.put(MESSAGE, "Problemas a tratar de cargar la informaci\u00F3n");
			result.put(FAILURE, true);
		}
		serializeObject(result, response);
	}
	
	@RequestMapping(value = "/guardarMediosBusquedaEmpresa", method = {RequestMethod.GET, RequestMethod.POST})
	public void guardarMediosBusquedaEmpresa(
			@RequestParam(required = false) Long redEmpresaFolio,
			@RequestParam(required = false) String[] redEmpresaMedioBusqueda,
			HttpServletResponse response){
		Map<String, Object> result = new HashMap<String, Object>();
		try{
			DBContext.getRedEmpresasService().guardarMediosBusquedaEmpresa(redEmpresaFolio, redEmpresaMedioBusqueda);
			result.put(MESSAGE, "Datos Actualizados");
			result.put(SUCCESS, true);
		}catch(WebException e){
			logger.error(e, e);
			result.put(MESSAGE, e.getMessage());
			result.put(FAILURE, true);
		}catch(Exception e){
			logger.error(e, e);
			result.put(MESSAGE, "Problemas a tratar de cargar la informaci\u00F3n");
			result.put(FAILURE, true);
		}
		serializeObject(result, response);
	}
	
	@RequestMapping(value = "/guardarSucursalEmpresa", method = {RequestMethod.GET, RequestMethod.POST})
	public void guardarSucursalEmpresa(
			@ModelAttribute RedEmpresaSucursales redEmpresaSucursales,
			HttpServletResponse response){
		Map<String, Object> result = new HashMap<String, Object>();
		try{
			Long redEmpresaFolio = redEmpresaSucursales.getRedEmpresaFolio().getRedEmpresaFolio();
			DBContext.getRedEmpresasService().guardarRedEmpresaSucursales(redEmpresaSucursales);
			result.put("list", DBContext.getRedEmpresasDao().findRedEmpresaSucursalByRedEmpresaFolio(redEmpresaFolio));
			result.put(MESSAGE, "Datos Actualizados");
			result.put(SUCCESS, true);
		}catch(WebException e){
			logger.error(e, e);
			result.put(MESSAGE, e.getMessage());
			result.put(FAILURE, true);
		}catch(Exception e){
			logger.error(e, e);
			result.put(MESSAGE, "Problemas a tratar de cargar la informaci\u00F3n");
			result.put(FAILURE, true);
		}
		serializeObject(result, response);
	}
	
	@RequestMapping(value = "/eliminarRedEmpresaSucursales", method = {RequestMethod.GET, RequestMethod.POST})
	public void eliminarRedEmpresaSucursales(
			@RequestParam Long redEmpresaFolio,
			@RequestParam Long currentId,
			HttpServletResponse response){
		Map<String, Object> result = new HashMap<String, Object>();
		try{
			DBContext.getRedEmpresasService().eliminarRedEmpresaSucursales(currentId);
			result.put("list", DBContext.getRedEmpresasDao().findRedEmpresaSucursalByRedEmpresaFolio(redEmpresaFolio));
			result.put(MESSAGE, "Datos Actualizados");
			result.put(SUCCESS, true);
		}catch(Exception e){
			logger.error(e, e);
			result.put(MESSAGE, "Problemas a tratar de actualizar la informaci\u00F3n <br />Sucursal asociado a uno o m\u00E1s Empresas");
			result.put(FAILURE, true);
		}
		serializeObject(result, response);
	}
	
	@RequestMapping(value = "/guardarContactoEmpresa", method = {RequestMethod.GET, RequestMethod.POST})
	public void guardarContactoEmpresa(
			@ModelAttribute RedEmpresasContactos redEmpresasContactos,
			HttpServletResponse response){
		Map<String, Object> result = new HashMap<String, Object>();
		try{
			Long redEmpresaFolio = redEmpresasContactos.getRedEmpresas().getRedEmpresaFolio();
			DBContext.getRedEmpresasService().guardarRedEmpresaContactos(redEmpresasContactos);
			result.put("list", DBContext.getRedEmpresasDao().findRedEmpresaContactoByRedEmpresaFolio(redEmpresaFolio));
			result.put(MESSAGE, "Datos Actualizados");
			result.put(SUCCESS, true);
		}catch(WebException e){
			logger.error(e, e);
			result.put(MESSAGE, e.getMessage());
			result.put(FAILURE, true);
		}catch(Exception e){
			logger.error(e, e);
			result.put(MESSAGE, "Problemas a tratar de cargar la informaci\u00F3n");
			result.put(FAILURE, true);
		}
		serializeObject(result, response);
	}
	
	@RequestMapping(value = "/eliminarRedEmpresaContactos", method = {RequestMethod.GET, RequestMethod.POST})
	public void eliminarRedEmpresaContactos(
			@RequestParam Long redEmpresaFolio,
			@RequestParam Long currentId,
			HttpServletResponse response){
		Map<String, Object> result = new HashMap<String, Object>();
		try{
			DBContext.getRedEmpresasService().eliminarRedEmpresaContactos(currentId);
			result.put("list", DBContext.getRedEmpresasDao().findRedEmpresaContactoByRedEmpresaFolio(redEmpresaFolio));
			result.put(MESSAGE, "Datos Actualizados");
			result.put(SUCCESS, true);
		}catch(Exception e){
			logger.error(e, e);
			result.put(MESSAGE, "Problemas a tratar de actualizar la informaci\u00F3n <br />Contacto asociado a uno o m\u00E1s Empresas");
			result.put(FAILURE, true);
		}
		serializeObject(result, response);
	}
	
}
